package com.atguigu.huffmantree;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

/**
 * @author durant
 * @create 2021-11-17 16:25
 */
public class HuffmanTreeDemo {
    public static void main(String[] args) {
        int[] arr ={13 ,7,8,3,29,6,1};
        Node huffmanTree = createHuffmanTree(arr);
//        System.out.println(huffmanTree);
        preOrder(huffmanTree);
    }
    // 前序遍历的方法
    public static void preOrder(Node node){
        node.preList();
    }
    // 创建赫夫曼树的方法
    public static Node createHuffmanTree(int[] arr){
        // 1.遍历arr数组
        // 2.将arr的每个元素构成一个node
        // 3.将node存放到arraylist中方便管理
        List<Node> list = new ArrayList<>();
        for (int value : arr){
            list.add(new Node(value));
        }
        // 排序（从小到大）
        Collections.sort(list);
//        System.out.println("nodes:"+ list);
        while (list.size() > 1) {// 当list中只有一个节点时，出来
            // 1.取出最小的二叉树
            Node leftNode = list.get(0);
            // 2.取出第二小的二叉树
            Node rightNode = list.get(1);
            // 3.构建父二叉树
            Node parent = new Node(leftNode.value + rightNode.value);
            parent.left = leftNode;
            parent.right = rightNode;
            // 将原来list中这两个数清空，并且添加父二叉树进入
            list.remove(leftNode);
            list.remove(rightNode);
            list.add(parent);
            Collections.sort(list);
//            System.out.println("第一次处理排序后");
//            System.out.println("nodes:" + list);
        }
        return list.get(0);
    }
}
// 为了让node对象支持排序，需要node实现comparable接口
class Node implements Comparable<Node>{
    int value;
    Node left;// 指向左子节点
    Node right;// 指向右子节点
    // 前序遍历
    public void preList(){
        System.out.println(this);
        if (this.left != null){
            this.left.preList();
        }
        if (this.right != null){
            this.right.preList();
        }

    }

    public Node(int value){
        this.value = value;
    }

    @Override
    public String toString() {
        return "Node{" +
                "value=" + value +
                '}';
    }

    @Override
    public int compareTo(Node o) {
        // 表示从小到大排序
        return this.value-o.value;
    }
}